package com.booksquare.data;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.List;
import com.booksquare.data.JDBCUtil;

public class LibroDao {

	public List<Libro> obtenerLibros(){
		Connection connection = null;
		Statement st = null;
		ResultSet rs = null;
		List<Libro> oListaLibros = new ArrayList<Libro>();
		
		try{
			connection = JDBCUtil.getConnection();
			st = connection.createStatement();
			
			final String sQuery = "Select l.Id_Libro, l.Id_Categoria, l.Id_Autor, l.Nombre, l.Isbn, l.Puntaje, 'NombreAutor' = a.Nombre, 'NombreCategoria' = c.Nombre "
					+ "From Libro l " 
					+ " Inner Join Autor a on l.Id_Autor = a.Id_Autor "
					+ " Inner Join Categoria c on l.Id_Categoria = c.Id_Categoria ";
			rs = st.executeQuery(sQuery);
			
			while(rs.next()){
				oListaLibros.add(new Libro(rs.getInt("Id_Libro"), rs.getString("Nombre"), rs.getInt("Id_Categoria"),
						rs.getInt("Id_Autor"), rs.getString("Isbn"), rs.getInt("Puntaje"), 
						new Autor(rs.getInt("Id_Libro"), rs.getString("NombreAutor"), 0),
						new Categoria(rs.getInt("Id_Categoria"), rs.getString("NombreCategoria"), 0)));
			}
		}
		catch(SQLException ex){
			throw new IllegalStateException("Error al obtener los libros", ex);
		}
		finally{
			JDBCUtil.closeResultSet(rs);
			JDBCUtil.closeStatement(st);
			JDBCUtil.closeConnection(connection);
		}
		return oListaLibros;
	}
	
	public List<Libro> obtenerLibros(String sNombre){
		Connection connection = null;
		Statement st = null;
		ResultSet rs = null;
		List<Libro> oListaLibros = new ArrayList<Libro>();
		
		try{
			connection = JDBCUtil.getConnection();
			st = connection.createStatement();
		
			sNombre = '%' + sNombre.trim() + '%';
			
			final String sQuery = "Select l.Id_Libro, l.Id_Categoria, l.Id_Autor, l.Nombre, l.Isbn, l.Puntaje, 'NombreAutor' = a.Nombre, 'NombreCategoria' = c.Nombre " 
					+ " From Libro l "
					+ " Inner Join Autor a on l.Id_Autor = a.Id_Autor "
					+ " Inner Join Categoria c on l.Id_Categoria = c.Id_Categoria "
					+ " Where l.Nombre like '" + sNombre + "'";
			rs = st.executeQuery(sQuery);
			
			while(rs.next()){
				oListaLibros.add(new Libro(rs.getInt("Id_Libro"), rs.getString("Nombre"), rs.getInt("Id_Categoria"),
						rs.getInt("Id_Autor"), rs.getString("Isbn"), rs.getInt("Puntaje"), 
						new Autor(rs.getInt("Id_Libro"), rs.getString("NombreAutor"), 0),
						new Categoria(rs.getInt("Id_Categoria"), rs.getString("NombreCategoria"), 0)));
			}
		}
		catch(SQLException ex){
			throw new IllegalStateException("Error al obtener los libros", ex);
		}
		finally{
			JDBCUtil.closeResultSet(rs);
			JDBCUtil.closeStatement(st);
			JDBCUtil.closeConnection(connection);
		}
		return oListaLibros;
	}
	
	public List<Libro> obtenerLibros(int nId){
		Connection connection = null;
		Statement st = null;
		ResultSet rs = null;
		List<Libro> oListaLibros = new ArrayList<Libro>();
		
		try{
			connection = JDBCUtil.getConnection();
			st = connection.createStatement();
	
			
			final String sQuery = "Select l.Id_Libro, l.Id_Categoria, l.Id_Autor, l.Nombre, l.Isbn, l.Puntaje, 'NombreAutor' = a.Nombre, 'NombreCategoria' = c.Nombre  "
					+ " From Libro l "
					+ " Inner Join Autor a on l.Id_Autor = a.Id_Autor "
					+ " Inner Join Categoria c on l.Id_Categoria = c.Id_Categoria " 
					+ " Where l.Id_Libro =" + Integer.toString(nId) ;
			rs = st.executeQuery(sQuery);
			
			while(rs.next()){
				oListaLibros.add(new Libro(rs.getInt("Id_Libro"), rs.getString("Nombre"), rs.getInt("Id_Categoria"),
						rs.getInt("Id_Autor"), rs.getString("Isbn"), rs.getInt("Puntaje"), 
						new Autor(rs.getInt("Id_Libro"), rs.getString("NombreAutor"), 0),
						new Categoria(rs.getInt("Id_Categoria"), rs.getString("NombreCategoria"), 0)));
			}
		}
		catch(SQLException ex){
			throw new IllegalStateException("Error al obtener los libros", ex);
		}
		finally{
			JDBCUtil.closeResultSet(rs);
			JDBCUtil.closeStatement(st);
			JDBCUtil.closeConnection(connection);
		}
		return oListaLibros;
	}
	
	public int RegistrarLibro(Libro oLibro){
		String cmdLibro;
		String sQuery;
		
		PreparedStatement pstm;
		Connection connection = null;
		Statement st = null;
		ResultSet rs = null;
		
		int nIdLibro = 0;
		int nOk = 0;
		
		try{
			connection = JDBCUtil.getConnection();
			st = connection.createStatement();
			
			sQuery = "Select Max(Id_Libro) + 1 from Libro";
			rs = st.executeQuery(sQuery);
			
			if(rs.next()){
				nIdLibro = rs.getInt(1);
				if (nIdLibro == 0){
					nIdLibro = 1;
				}
			}
			oLibro.setId(nIdLibro);
			//st = connection.createStatement();
			
			cmdLibro = "Insert into Libro (Id_Libro, Id_Categoria, Id_Autor, Nombre, Isbn, Puntaje) values (?, ?, ?, ?, ?, ?)";
			pstm = connection.prepareStatement(cmdLibro);
			pstm.setInt(1, oLibro.getId());
			pstm.setInt(2, oLibro.getCategoria());
			pstm.setInt(3, oLibro.getAutor());
			pstm.setString(4, oLibro.getNombre());
			pstm.setString(5, oLibro.getIsbn());
			pstm.setInt(6, oLibro.getPuntaje());
		}
		catch (SQLException e) {
            throw new IllegalStateException("Error al registrar el cliente", e);
        } finally {
        	JDBCUtil.closeResultSet(rs);
        	JDBCUtil.closeStatement(st);
        	JDBCUtil.closeConnection(connection);
        }
        return nOk;
		
	}
	
}
